/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestorSimilar;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.exceptions.PaginaExistenteException;
import util.exceptions.PaginaNoExistenteException;

/**
 *
 * @author Nacho
 */
public class Pagina {

    private String url;
    private int reputacion;
    private LinkedList<Tema> temas;
    private int id;

    /**
     * Lista todas las páginas de la base de datos
     * @return LinkedList de las páginas
     */
    static LinkedList<Pagina> listaTodasLasPaginas() {
        throw new UnsupportedOperationException();
    }
    /**
     * Inserta página en la base de datos. 
     * @param url 
     * @param temas Puedes mandar null o una lista vacía cuando no hay temas.
     * Asume que los ids de los temas son correctos
     * @return
     * @throws PaginaExistenteException Cuando ya existe la página
     */
    static Pagina insertaPagina(String url, LinkedList<Tema> temas) throws PaginaExistenteException {
        //conexion a base de datos, me da la id, y la pongo en el campo de abajo
        Conexion cn = Conexion.getConexion();
        ResultSet rs;
        int id = 0;
        try {
            rs = cn.ejecutaSP("creaPagina('" + url + "',0);");
            rs.next();
            id = rs.getInt(1);
            Pagina p = new Pagina(url, 0, null, id);
            System.out.println(id);
            p.setTemas(temas);
            return p;
        } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException exx) {
            throw new PaginaExistenteException();
        } catch (SQLException ex) {
            ex.printStackTrace();
            System.exit(-1);
            return null;
        }
    }

    static Pagina obtenPagina(String url) {
        Conexion cn = Conexion.getConexion();
        ResultSet rs;
        Pagina p = null;
        try {
            rs = cn.ejecutaSP("selectPagina('" + url + "');");
            if (rs.next()) {
                p = new Pagina(rs.getString(2), rs.getInt(3), rs.getInt(1));
                p.temas = Tema.getTemasDePagina(p);
            } else {
                throw new PaginaNoExistenteException();
            }
        } catch (Exception e) {
            throw new PaginaNoExistenteException();
        }
        
        return p;

    }

    static void eliminaPagina(String url) {
        Conexion cn = Conexion.getConexion();
       Pagina p = Pagina.obtenPagina(url);
       int id = p.id;
        try {
            cn.ejecutaSP(String.format("borraPagina(%d)",id));
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        
    }

    static LinkedList<Pagina> getTodasLasPaginas() {
        Conexion cn = Conexion.getConexion();
        ResultSet rs = null;
        try {
            rs = cn.ejecutaSP("getTodasPaginas();");
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
        return fromRStoList(rs);
    }

    static LinkedList<Pagina> fromRStoList(ResultSet rs) {
        LinkedList<Pagina> lista = new LinkedList<Pagina>();
        Pagina p;
        try {
            while (rs.next()) {
                p = new Pagina(rs.getString(2), rs.getInt(3), rs.getInt(1));
                lista.add(p);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return lista;
    }

    private Pagina(String url, int reputacion, LinkedList<Tema> temas, int id) {
        this.url = url;
        this.reputacion = reputacion;
        this.temas = temas;
        this.id = id;
    }

    private Pagina(String url, int reputacion, int id) {
        this.url = url;
        this.reputacion = reputacion;
        this.id = id;
    }

    private Pagina() {
    }

    public String getUrl() {
        return url;
    }

    void votaArriba() {
        Conexion cn = Conexion.getConexion();
        try {
            ResultSet rs = cn.ejecutaSP("votaArriba(" + id + ");");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        reputacion++;
    }

    void votaAbajo() {
        Conexion cn = Conexion.getConexion();
        try {
            ResultSet rs = cn.ejecutaSP("votaAbajo(" + id + ");");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        reputacion--;
    }

    public int getReputacion() {
        return reputacion;
    }

    void setReputacion(int reputacion) {
        this.reputacion = reputacion;
        throw new UnsupportedOperationException();
    }

    public LinkedList<Tema> getTemas() {
        if (temas == null) {
            temas = Tema.getTemasDePagina(this);
        }
        return temas;
    }

    void setTemas(LinkedList<Tema> temas) {
        this.temas = temas;
        Conexion cn = Conexion.getConexion();
        String s;
        for (Tema tema : temas) {
            try {
                s = String.format("insertaTemaPagina(%d,%d)", tema.getId(), id);
                System.out.println(s);
                cn.ejecutaSP(s);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }



    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Pagina{" + "url=" + url + ", reputacion=" + reputacion + ", temas=" + getTemas() + ", id=" + id + '}';
    }

    public static void main(String[] args) {
        LinkedList<Tema> temas = Tema.getTodosTemas();
        System.out.println(temas);
        try {
            Pagina p = Pagina.insertaPagina("www.disney4.com", temas);
        } catch (PaginaExistenteException ex) {
            System.out.println("La pagina ya existe");
        }
    }
}
